import os
from tqdm import tqdm


def call_parse_prompt():
    """
    Find the prompts_raw directory and generate an __init__.py file containing prompt texts.

    Searches for prompts_raw directory in current and parent directories. Once found,
    calls create_python_file_with_texts() to generate the __init__.py file.
    """
    current_file_path = os.path.abspath(__file__)
    current_folder_path = os.path.dirname(current_file_path)
    folder_path = os.path.join(current_folder_path, "prompts_raw")
    
    # If prompts_raw not found in current directory, search parent directories
    if not os.path.exists(folder_path):
        parent_dir = current_folder_path
        while parent_dir != os.path.dirname(parent_dir):  # Stop at root directory
            parent_dir = os.path.dirname(parent_dir)
            test_path = os.path.join(parent_dir, "prompts_raw")
            if os.path.exists(test_path):
                folder_path = test_path
                break
    
    output_file = os.path.join(folder_path, "__init__.py")
    create_python_file_with_texts(folder_path, output_file)


def create_python_file_with_texts(folder_path: str, output_file: str) -> None:
    """
    Generate a Python file containing prompt texts from .txt files.

    Args:
        folder_path (str): Path to directory containing prompt .txt files
        output_file (str): Path where the generated Python file will be saved

    The function reads all .txt files in the given folder, converts their contents
    into Python variables, and writes them to the output file. Variable names are
    derived from file paths with special characters replaced.
    """
    with open(output_file, 'w', encoding='utf-8') as out_file:
        out_file.write("# This file is generated automatically through parse_prompt.py\n\n")
        txt_files = [file for root, dirs, files in os.walk(folder_path) for file in files if file.endswith(".txt")]
        for file in tqdm(txt_files, desc="Processing files"):
            file_path = os.path.join(folder_path, file)
            var_name = "_" + file_path.replace(folder_path, "").replace(os.sep, "_").replace(".txt", "").strip("_")
            with open(file_path, 'r', encoding='utf-8') as f:
                content = f.read().replace('"""', '\"\"\"')
                out_file.write(f'{var_name} = """{content}"""\n\n')


if __name__ == "__main__":
    call_parse_prompt()